#include <iostream>
#include <cstring>
#include <memory>

// sha系列 哈希算法都包含该头文件
#include <openssl/bio.h>
#include <openssl/sha.h>

void hash_sha1()
{
    // 初始化一个SHA1_CTX结构体
    SHA_CTX ctx;
    // 初始化哈希算法
    SHA1_Init(&ctx);
    // 填充数据
    // Update 可多次添加数据
    SHA1_Update(&ctx, "hello", strlen("hello"));
    SHA1_Update(&ctx, ", world", strlen(", world"));
    // 计算哈希值
    unsigned char md[SHA_DIGEST_LENGTH];
    SHA1_Final(md, &ctx);
    // 输出结果
    std::unique_ptr<char[]> res(new char[SHA_DIGEST_LENGTH * 2 + 1]);
    for (int i = 0; i < SHA_DIGEST_LENGTH; ++i)
    {
        sprintf(res.get() + i * 2, "%02x", md[i]);
    }
    std::cout << "0x" << res.get() << std::endl;


    // ===========================================================

    // 直接计算
    unsigned char md2[SHA_DIGEST_LENGTH];
    SHA1((const unsigned char *)"hello, world", strlen("hello, world"), md2);
    std::unique_ptr<char[]> res2(new char[SHA_DIGEST_LENGTH * 2 + 1]);
    for (int i = 0; i < SHA_DIGEST_LENGTH; ++i)
    {
        sprintf(res2.get() + i * 2, "%02x", md2[i]);
    }
    std::cout << "0x" << res2.get() << std::endl;
}

int main(void)    
{
    hash_sha1();

    return 0;
}
